// 阻止冒泡事件
var _StopBubble = function(){
	window.event.cancelBubble = true;
	return false;
};

//定义表格工具
var GridUtil = {};
GridUtil.ExportURL = ctx + "/common/export.jsp";
GridUtil.CustomURL = ctx + "/common/custom.jsp";
// 导出数据
GridUtil.initExport = function( bean ){	
	if( bean.count == 0  ){
		Message.alert("请先查询出数据!");
		return false;
	}
	var url = GridUtil.ExportURL;
	window.showModalDialog(url , bean ,"center:1;dialogWidth:400px;dialogHeight:200px;scroll:0;help:0;status:1");
};

// public 实例化报表
GridUtil.createReport = function( param ){
	var table = new ReportTable();
	// 初始化参数
	table.initParam(param);
	// 初始化事件
	table.initEvent(param);
	return table;
};

// public 实例化操作型表格
GridUtil.createTable = function( param ){
	var table = new DreamTable();
	// 初始化事件
	table.initParam(param);
	// 初始化参数
	table.initEvent(param);
	return table;
};

var AbstractTable ={};
AbstractTable.param = {};
AbstractTable.initParam = function(param){
	var tableID = param.tableID;
	var tableConfig = param.tableConfig;
	// 表格ID
	this.tableID = tableID;
	// 表头配置
	this.tableConfig = tableConfig;
	// 表格
	this.table = "#" + tableID + " .rtable";
	// 所有行
	this.allRows = "#" + tableID + " .rtable>tbody>tr";
	// 所有Checkbox
	this.allCheckbox = "#" + tableID + " .CHECKBOX_ROW";
	// 全选/反选 Checkbox
	this.toggleCheckbox = "#CHECKBOX_TOGGLE";
	// 所有选中行
	this.allSelectRows = "#" + tableID + " .rtable .tr_select";
	// 所有表头 
	this.allHeads = "#" + tableID + " .rtable th";
	// 所有锁定表头 
	this.allLockTR = "#" + tableID + " .rtable tr.lock";
	// 所有排序的元素
	this.allSortTD = "#" + tableID + " .rtable th[sort='true']";
	// 所有排序的元素
	this.allSortSpan = "#" + tableID + " .rtable th[sort='true'] .thsort";
	// 所有调整宽度元素
	this.allResizeSpan = "#" + tableID + " .rtable th[sort='true'] .thresize";
	// 滑过样式
	this.classHover = "trover";
	// 选中样式
	this.classSelect = "tr_select";
	// 选择模式
	this.selectMode = param.selectMode;
};

// 初始化事件
AbstractTable.initEvent = function( param ){
	if( param.isRowsHover )
		this.initRowsHover();
	if( param.isRowsSelect )
		this.initRowsSelect();
	if( param.isHeadHover )
		this.initHeadHover();
	if( param.isSortable )
		this.initSortable();
	if( param.isHideCols )
		this.initHideCols();
	if( param.isResize && false) // 调整列宽
		this.initResize();
};

// private 是否被选择
AbstractTable.isSelect = function( row ){
	return jQuery(row).hasClass(this.classSelect);
};

// private 行滑过变色，背景点击变色
AbstractTable.initRowsHover = function(){
	var _this = this;
	jQuery(_this.allRows).hover( function(){
		jQuery(this).addClass(_this.classHover);
	},function(){
		jQuery(this).removeClass(_this.classHover);
	});
};

// private 选中样式变色
AbstractTable.initRowsSelect = function(){
	var _this = this;
	jQuery(_this.allRows).click( function(){
		jQuery(this).toggleClass(_this.classSelect);
		_this.setRowSelect(this,_this.isSelect(this));
	});
	jQuery(_this.toggleCheckbox).mousedown(function(){
		this.checked = !this.checked;
		if( this.checked ){
			jQuery(_this.allRows).addClass(_this.classSelect);
			jQuery(_this.allCheckbox).attr("checked","true");
		}else{
			jQuery(_this.allRows).removeClass(_this.classSelect);
			jQuery(_this.allCheckbox).removeAttr("checked");
		}
	});
	jQuery(_this.toggleCheckbox).toggle(function(){
		this.className = "checked";
		jQuery(_this.allRows).addClass(_this.classSelect);
		jQuery(_this.allCheckbox).attr("checked",true);
	},function(){
		this.className = "uncheck";
		jQuery(_this.allRows).removeClass(_this.classSelect);
		jQuery(_this.allCheckbox).removeAttr("checked");
	});
};

// private 表头滑过变色
AbstractTable.initHeadHover = function(){
	var _this = this;
	//表头滑过变色
	jQuery("#" + _this.tableID + " .rtable th").hover( function(){
		var col = jQuery(this).attr("col");
		var values = col.split(/#/g);
		for( var i = 0 ; i < values.length ; i++ ){
			if( values[i].length == 0 ) continue;
				jQuery("#" + _this.tableID + " .report tbody td[col='" +  values[i] + "']").addClass("tdover");
		}
	},function(){
		var col = jQuery(this).attr("col");
		var values = col.split(/#/g);
		for( var i = 0 ; i < values.length ; i++ ){
			if( values[i].length == 0 ) continue;
				jQuery("#" + _this.tableID + " .report tbody td[col='" +  values[i] + "']").removeClass("tdover");
		}
	});
};

//private 点击表头排序
AbstractTable.initSortable = function(){
	var _this = this;
	jQuery(_this.allSortSpan).hover( function(){
		var span = jQuery(this);
		var sclass = span.attr("sclass");
		if( sclass ){
			jQuery(this).addClass(sclass);
		}else{
			jQuery(this).addClass("asc");
			span.attr("sclass","asc");
		}
	},function(){
		jQuery(this).removeClass("asc");
		jQuery(this).removeClass("desc");
	}).toggle( function(){
		jQuery(this).addClass("desc");
		jQuery(this).removeClass("asc");
		jQuery(this).attr("sclass","desc");
		var td = jQuery(this).parent();
		_this.sort(td.attr("id"),'desc');
	}, function(){
		jQuery(this).addClass("asc");
		jQuery(this).removeClass("desc");
		jQuery(this).attr("sclass","asc");
		var td = jQuery(this).parent();
		_this.sort(td.attr("id"),'asc');
	});
};

//private 调整宽度
AbstractTable.initResize = function(){
	var _this = this;
	jQuery(this.allHeads).each( function(){
		jQuery(this).width(jQuery(this).width());
	});
	jQuery(this.allResizeSpan).mousedown( function(e){
		this.downx = e.clientX;
		this.table = jQuery(_this.table);
		this.td = jQuery(this).parent();
		this.downt = this.table.width();
		this.downw = this.td.width();
		this.setCapture();
	}).mousemove( function(e){
		if( this.downx != 'false' ){
			var offset = e.clientX - this.downx;
			if( Math.abs(offset) > 5 ){
				this.td.width(this.downw + offset);
				this.table.width(this.downt + offset);
			}
		}
	}).mouseup(function(){
		this.releaseCapture();
		this.downx = "false";
	})
};

// private 取得比较器
AbstractTable.getComparator = function( index , dataType ,order ) {   
	return function( a , b ){
		var as = a.cells(index).innerText;
		var bs = b.cells(index).innerText;
		var v1 = 0 , v2 = 0;
		if( as == bs ) return 0;
		if( dataType == 'string' ){
			v1 = (as + "0").charCodeAt(0);
			v2 = (bs + "0").charCodeAt(0);
		}else if( dataType == 'number' ){
			v1 = new Number("0" + as);
			v2 = new Number("0" + bs);
		}else if( dataType == 'number-comma' || dataType == 'number-percent'){
			var p1 = ("0" + as).replace(/[,%]/g,"");
			var p2 = ("0" + bs).replace(/[,%]/g,"");
			v1 = new Number(p1);
			v2 = new Number(p2);
		}else if( dataType == 'date'){
			var p1 = ("0" + as).replace(/[-\/]/g,"");
			var p2 = ("0" + bs ).replace(/[-\/]/g,"");
			v1 = new Number(p1);
			v2 = new Number(p2);
		}
		var v = (v1 < v2) ? -1 : ( v1 > v2 ? 1 : 0 );
		return order == 'asc' ? v : v*(-1);
	};
};

// public 排序
AbstractTable.sort = function( col , order ){
	var th = jQuery("#" + col);
	var dataType = th.attr("dataType");
	// 取得排序的索引号
	var index = this.getSortIndex(col);
	var rows = jQuery(this.allRows).get();
	// 排序
	rows.sort( this.getComparator(index , dataType ,order) );
	var tbody = jQuery("#" + this.tableID + " .rtable>tbody");
	// 创建文档碎片，批量把行添加到表格对象中，速度更快
	var fragment = document.createDocumentFragment();   
    for (var i = 0; i < rows.length; i++) {
		fragment.appendChild(rows[i]);
		rows[i].setAttribute("index",i);
    }
	tbody.append(fragment);
};

// private 取得排序列的索引号
AbstractTable.getSortIndex = function( id ){
	var index = 0 ;
	var selector = "#" + this.tableID + " .rtable>tbody>tr:first>td";
	// 找到需要排序的列
	jQuery(selector).each( function(i){
		if( id == jQuery(this).attr("col") ){
			index = i;
			return false;
		}
	});
	return index;
};

// private 显示隐藏列
AbstractTable.initHideCols = function(){
	var _this = this;
	var tableID = this.tableID;
	var tableConfig = this.tableConfig;
	// 点击列选择按钮
	jQuery("#" + tableID + " A[name=SelectCols]").hover( function(){
		var p = jQuery(this).offset();
		var h = jQuery(this).parent().height();
		jQuery("#" + tableID + " .colselect").css({"top":p.top + h,"left":p.left});
		jQuery("#" + tableID + " .colselect").show();
	},function(){
	});
	
	// 行选择滑过变色，保持菜单出现。
	jQuery("#" + tableID + " .colselect").hover( function(){
		jQuery(this).show();
	},function(){
		jQuery(this).hide();
		// 如果有变,更新用户字段
		if( GridUtil._CHANGED ){
			var cols = new String();
			jQuery("#" + tableID + " :checkbox:not(:checked)").each(function(i,e){
				cols += e.value + ",";
			});
			// 保存未选择的字段
			jQuery.post( GridUtil.CustomURL,{"cols":cols,"tableConfig":tableConfig});
			GridUtil._CHANGED = false;
		}
	}).find("tr").hover( function(){
		jQuery(this).addClass("ndcolover");
	},function(){
		jQuery(this).removeClass("ndcolover");
	})
	
	//隐藏/显示列
	jQuery("#" + tableID + " .colselect input[type=checkbox]").click( function(){
		GridUtil._CHANGED = true;
		var values = this.value.split(/#/g);
		_this.showHideCols(values,this.checked);
	});
};


// public 隐藏列
AbstractTable.showHideCols = function( cols , isShow ){
	var _this = this;
	var tableID = _this.tableID;
	for( var m = 0 ; m < cols.length ; m++ ){
		var col = jQuery("#" + cols[m]).attr("col");
		if( !col ) return;
		var values = col.split(/#/g);
		for( var i = 0 ; i < values.length ; i++ ){
			var tdv = values[i];
			var thv = "#" + values[i] + "#";
			// 对应的所有TD
			var tds = jQuery("#" + tableID + " .report tbody td[col='" +  tdv + "']");
			// 对应的表头TH
			var ths = jQuery("#" + tableID + " .report thead th[col*='" + thv + "']");
			// 列对应的合计、小计行。
			var rows =jQuery("#" + tableID + " .rtable>tbody>tr[stat='" + tdv + "']");
			if( isShow ){
				tds.show();ths.show();rows.show();
			}else{
				tds.hide();ths.hide();rows.hide();
			}
		}
	}
};

// public 隐藏列
AbstractTable.hideCols = function( cols ){
	this.showHideCols(cols,false);
};

// public 显示列
AbstractTable.showCols = function( cols ){
	this.showHideCols(cols,true);
};

// public 锁定表头
AbstractTable.lockHead = function( isLock ){
	var tableID = this.tableID;
	if( isLock ){
		jQuery(this.allHeads).css("left","0");
		jQuery(this.allLockTR).css("position","relative");
	}else{
		jQuery(this.allHeads).css("left","1px");
		jQuery(this.allLockTR).css("position","static");
	}
};

// private 将一行中的所有列转换为JsonObject
AbstractTable.toJsonObject = function( row ,cols){
	var row = jQuery(row);
	var rownum = row.attr("index");
	var isSelect = row.hasClass(this.classSelect);
	var bean = {toJSON:function(){
		var json = new String("{");
		for( prop in bean ){
			if( prop!='toJSON')
				json += prop + ":'" + bean[prop] + "',";
		}
		return json.substring(0,json.length-1) + "}";
	},select:isSelect,index:rownum};
	jQuery(row).find("td").each( function(){
		if( cols ){
			var name = jQuery(this).attr("col");
			if( cols.indexOf(name) != -1 ){
				var value = jQuery(this).text();
				bean[name] = value;
			}
		}else{
			var name = jQuery(this).attr("col");
			var value = jQuery(this).text();
			bean[name] = value;
		}
	});
	return bean;
};

//private 数组扩展方法
AbstractTable.ARRAY_EXTENDS={toJSON:function(){
	if( this.length == 0 ) return "[]";
	var json = new String("[");
	for( var i = 0 ; i < this.length ; i++ ){
		json += this[i].toJSON() + ",";
	}
	return json.substring(0,json.length-1) + "]";
},toArray:function( col ){
	var values = [];
	for( var i = 0 ; i < this.length ; i++ ){
		values.push(this[i][col]);
	}
	return values;
}};

// public 取得选中的行
AbstractTable.getSelectRows = function( cols ){
	var _this = this;
	var rows = [];
	jQuery.extend(rows,this.ARRAY_EXTENDS);
	jQuery(_this.allSelectRows).each( function(i){
		var bean = _this.toJsonObject(this,cols);
		rows.push( bean );
	});
	return rows;
};

// public 取得选中的数量
AbstractTable.getSelectCount = function(){
	return jQuery(this.allSelectRows).size();
};

// public 取得所有行
AbstractTable.getAllRows = function(){
	var _this = this;
	var rows = [];
	jQuery.extend(rows,this.ARRAY_EXTENDS);
	jQuery(_this.allRows).each(function(){
		rows.push( _this.toJsonObject(this) );
	});
	return rows;
};

// public 应用行规则
AbstractTable.applyRowCustom = function( custom ){
	var _this = this;
	jQuery(_this.allRows).each(function(i,e){
		var bean = _this.toJsonObject(this);
		// 调用用户自定义样式接口
		var p = custom( bean , i );
		if( p ) // 清除原来的样式
			jQuery(this).removeClass(_this.classSelect);
		
		// 添加Style
		if( p && p.style )
			this.style.cssText = p.style;
		// 添加Class	
		if( p && p.className )
			jQuery(this).addClass(p.className);
	});
};

// public 应用单元格规则
AbstractTable.applyCellCustom = function( custom ){
	var _this = this;
	jQuery(_this.allRows).each(function(e){
		var bean = _this.toJsonObject(this);
		jQuery(this).find("td").each( function(yIndex,e){
			var colName = jQuery(this).attr("col");
			var p = custom(bean,colName);
			// 添加Style
			if( p && p.style )
				this.style.cssText = p.style;

			// 添加Class
			if( p && p.className )
				jQuery(this).addClass(p.className);
				
			// 添加Class
			if( p && p.value )
				jQuery(this).html(p.value);
		});
	});
};

// public 删除选中行
AbstractTable.removeSelectRows = function(){
	jQuery(this.allSelectRows).each(function(i,e){
		this.removeNode(true);
	});
};

// public 全选
AbstractTable.selectAll = function(){
	var _this = this;
	jQuery(_this.allRows).each(function(i,e){
		jQuery(this).addClass(_this.classSelect);
	});
};

// public 反选
AbstractTable.reverseAll = function(){
	var _this = this;
	jQuery(_this.allRows).each(function(i,e){
		var row = jQuery(this);
		if(row.hasClass(_this.classSelect)){
			row.removeClass(_this.classSelect);
		}else{
			row.addClass(_this.classSelect);
		}
	});
};

// public 应用删除规则
AbstractTable.applyRemoveCustom = function( custom ){
	var _this = this;
	var rows = jQuery(_this.allRows);
	rows.each(function(i,e){
		var bean = _this.toJsonObject(this);
		// 判断返回值，是否删除。
		if( custom( bean , i ) )
			this.removeNode(true);
	});
};

// public 应用选择规则
AbstractTable.applySelectRow = function( custom ){
	var _this = this;
	var rows = jQuery(_this.allRows);
	rows.each(function(i,e){
		var bean = _this.toJsonObject(this);
		if( custom( bean , i ) ){
			_this.setRowSelect(this,true);
		}
	});
};

// private 设置行的选中状态
AbstractTable.setRowSelect = function( row , select ){
	var id = jQuery(row).attr("id");
	if( select ){
		jQuery(row).addClass(this.classSelect);
	}else{
		jQuery(row).removeClass(this.classSelect);
	}
	jQuery("input[name='" + id + "']").attr("checked",select);
};

// public 定义选中行事件
AbstractTable.onRowSelect = function( handler ){
	var _this = this;
	jQuery(_this.allRows).click( function(i){
		var isSelect = jQuery(this).hasClass(_this.classSelect);
		// 正在选择过程中的不算
		var choosing = (event.shiftKey || event.ctrlKey);
		if( isSelect && !choosing ){
			var bean = _this.toJsonObject(this);
			handler( bean );
		}
	});
};


// 传说中的构造函数
window.ReportTable = function( tableID , tableConfig ){
};
/// 继承 AbstractTable <report:list <report:stat
jQuery.extend(ReportTable.prototype,AbstractTable);

window.DreamTable = function(){
};
/// 继承 AbstractTable
jQuery.extend(DreamTable.prototype,AbstractTable);

// 重写排序Sort <grid:table
DreamTable.prototype.sort = function( col , order ){
	var th = jQuery("#" + col);
	var dataType = th.attr("dataType");
	// 取得排序的索引号
	var index = this.getSortIndex(col);
	var rows = jQuery(this.allRows).get();
	// 排序
	rows.sort( this.getComparator(index , dataType ,order) );
	var tbody = jQuery("#" + this.tableID + " .rtable>tbody");
	// 创建文档碎片，批量把行添加到表格对象中，速度更快
	var fragment = document.createDocumentFragment();   
    for (var i = 0; i < rows.length; i++) {
		fragment.appendChild(rows[i]);
		rows[i].setAttribute("index",i);
		if( i%2 == 0 ){
			jQuery(rows[i]).removeClass("tr1");
		}else{
			jQuery(rows[i]).addClass("tr1");
		}
    }
	tbody.append(fragment);
};

// 重写initRowsSelect方法
DreamTable.prototype.initRowsSelect = function(){
	if( this.selectMode != "single"){
		AbstractTable.initRowsSelect.apply(this);
		return true;
	}
	var _this = this;
	jQuery(_this.allRows).click( function(event){
		if( event.shiftKey ){
			var m = jQuery(_this.allRows).index(this);
			var n = jQuery(_this.allRows).index(_this.lastSelect);
			var start = m > n ? n : m;
			var end = m < n ? n : m;
			jQuery(_this.allRows).each(function(i){
				if( i >= start && i <= end ){
					jQuery(this).addClass(_this.classSelect);
					jQuery("input[name='" + this.id + "']").attr("checked",true);
				}
			});
		}else{
			if( !event.ctrlKey ){
				jQuery(_this.allSelectRows).removeClass(_this.classSelect);
				jQuery(_this.allCheckbox).removeAttr("checked");
				jQuery(this).toggleClass(_this.classSelect);
				_this.setRowSelect(this,_this.isSelect(this));
			}else{
				jQuery(this).toggleClass(_this.classSelect);
				_this.setRowSelect(this,_this.isSelect(this));
			}
			_this.lastSelect = this;
		}
	});
	
	jQuery(_this.toggleCheckbox).toggle(function(){
		this.className = "checked";
		jQuery(_this.allRows).addClass(_this.classSelect);
		jQuery(_this.allCheckbox).attr("checked",true);
	},function(){
		this.className = "uncheck";
		jQuery(_this.allRows).removeClass(_this.classSelect);
		jQuery(_this.allCheckbox).removeAttr("checked");
	});
	
	// 屏蔽选择功能
	jQuery(document.body).keydown( function() {
		if( event.keyCode == 16 || event.keyCode == 17 ) // shift,ctrl键
			jQuery(this).bind("selectstart",function(){return false;});
	});
	// 多选完成后，恢复选择功能
	jQuery(document.body).keyup( function() {
		if( event.keyCode == 16 || event.keyCode == 17 ) // shift,ctrl键
			jQuery(this).unbind("selectstart");
	});
};
